#include "Poller.h"
#include "EPollPoller.h"

#include <stdlib.h>

// 为了避免基类直接引用派生类引入了一个公共源文件

/**
 * 好处1：可以减少编译依赖。例如，如果 EPollPoller 的实现改变了，只需重新编译 EPollPoller 相关的文件和工厂方法所在的文件，
 * 而不需要重新编译使用 Poller 基类的所有代码。
 * 好处2：如果 Poller 类定义在一个头文件中，而 EPollPoller 类在另一个头文件中，并且 EPollPoller 也需要包含 Poller，
 * 那么将工厂方法放在一个单独的源文件中可以避免循环包含。
 */
Poller *Poller::newDefaultPoller(EventLoop *loop)
{
    // 尝试获取名为 "MUDUO_USE_POLL" 的环境变量的值。
    // 如果该环境变量存在，getenv 返回一个指向该值的指针；如果不存在，返回 nullptr。
    // 使用 ::getenv 表示调用的是全局命名空间中的 getenv 函数，而不是任何其他命名空间中的同名函数。
    if (::getenv("MUDUO_USE_POLL"))
    {
        return nullptr; // 生成poll的实例
    }
    else
    {
        return new EPollPoller(loop); // 生成epoll的实例
    }
}